import os

from common.Exception import PPTStateUpdateError
from common.pptx_common import remove_extension
from config.ppt_config import PPTX_FOLDER
from service.ppt_service import get_ppt_by_name_service, update_ppt_state_service, create_new_ppt
from utils.log import logger
from threading import Thread
from typing import IO
from pojo.ppt import PPT
from utils.video_analyze import ppt_analyze_non_ai, ppt_analyze_ai
from sqlalchemy.orm import Session

def video_generate(file, pptx_name, user_id):
    """
    将PPT生成视频
    :param user_id: 用户ID
    :param file: 文件对象
    :param pptx_name:文件名
    :param speech_list:演讲稿列表
    :return: 生成的视频的minio地址
    """
    logger.info("进入视频生成方法")

    # 本地保存一份PPT文件
    ppt_path = os.path.join(PPTX_FOLDER, pptx_name)

    # 用同步方式写文件，注意 file.file 是底层的文件对象
    with open(ppt_path, "wb") as f:
        f.write(file.file.read())  # 读取上传文件的全部内容写入

    # 移除字符串尾部后缀
    pptx_name = remove_extension(pptx_name)

    # 回到文件指针开头
    file.file.seek(0)

    # 通过pptx_name拿到PPT,若为AI生成的PPT则拿到了PPT对象，若不是AI生成的，则PPT表中为空，所以得先将此PPT插入
    ppt = get_ppt_by_name_service(pptx_name)
    if ppt:
        # 提交PPT，此时PPT状态为2,返回PPT上传成功
        data = update_ppt_state_service(ppt["ppt_id"], 2)
        # 开启异步任务解析音频
        logger.info("开启异步解析任务，此时解析的是AI生成的PTT")
        thread_generate = Thread(target=ppt_analyze_ai, args=(data["ppt_id"], ppt_path,))
        thread_generate.start()
        return "上传成功"

    # PPT不是由AI生成，是用户上传的自己的PPT，那么还得OCR对文本进行填充
    else:
        # 插入一行新的记录
        ppt = PPT(ppt_name=pptx_name, user_id=user_id, ppt_state=0, is_ai=0, type_id=1)
        # 创建新的PPT
        ppt = create_new_ppt(ppt)
        # 修改PPT状态
        update_ppt_state_service(ppt["ppt_id"], 2)
        # 创建该PPT对应的新的slide


        # 开启异步任务解析音频
        logger.info("开启异步解析任务，此时解析的是非AI生成的PPT")
        thread_generate = Thread(target=ppt_analyze_non_ai, args=(ppt["ppt_id"], file,))
        thread_generate.start()

        return "上传成功"